home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Camelot
/
Camelot 078 (1990-06)(Swedish User Group of Amiga)(SE)(PD)[WB].zip
/
Camelot 078 (1990-06)(Swedish User Group of Amiga)(SE)(PD)[WB].adf
/
MSH
/
src
/
date.c
next >
Wrap
C/C++ Source or Header
|
1990-06-17
|
4KB
|
165 lines
/*-
* $Id: date.c,v 1.30 90/06/04 23:18:11 Rhialto Rel $
* $Log: date.c,v $
* Revision 1.30 90/06/04 23:18:11 Rhialto
* Release 1 Patch 3
*
* DATE.C
*
* Two date conversion routines: DateStamp <-> MSDOS date/time.
*
* This code is (C) Copyright 1989 by Olaf Seibert. All rights reserved. May
* not be used or copied without a licence.
*/
#include <libraries/dos.h>
#include "han.h"
#define BASEYEAR 1978
#define DAYS_PER_YEAR 365
#define HOURS_PER_DAY 24
#define MINUTES_PER_HOUR 60
#define SECONDS_PER_MINUTE 60
#define DAYS_PER_WEEK 7
#define MONTHS_PER_YEAR 12
#define MINUTES_PER_DAY (MINUTES_PER_HOUR * HOURS_PER_DAY)
#define SECONDS_PER_DAY ((long) SECONDS_PER_MINUTE * \
MINUTES_PER_HOUR * HOURS_PER_DAY)
#define LeapYear(year) ((year & 3) == 0) /* From 1-Mar-1901 to 28-Feb-2100 */
int daycount[MONTHS_PER_YEAR] = {
31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31
};
void
ToDateStamp(datestamp, date, time)
struct DateStamp *datestamp;
word date;
word time;
{
{
int hours, minutes, seconds;
seconds = (time & 31) * 2;
time >>= 5;
minutes = time & 63;
time >>= 6;
hours = time;
datestamp->ds_Minute = MINUTES_PER_HOUR * hours + minutes;
datestamp->ds_Tick = TICKS_PER_SECOND * seconds;
}
{
ulong i, j, t;
int year, month, day;
if (date < DATE_MIN)
date = DATE_MIN;
day = date & 31;
date >>= 5;
month = (date & 15) - 1;
date >>= 4;
year = date + 1980;
if ((unsigned)month > 11 ||
(unsigned)day > (unsigned)daycount[month]) {
day = 31;
month = 11;
year = 1979;
}
j = year - BASEYEAR;
/* Get the next lower full leap period (4 years and a day) since ... */
t = (year - BASEYEAR) & ~3;
i = t;
t = (t / 4) * (4 * DAYS_PER_YEAR + 1);
/* t now is the number of days in 4 whole years since ... */
/*dbprintf(("ly0: i=%ld(%ld) j=%ld(%ld) t=%ld\n", i, i+BASEYEAR,j,j+BASEYEAR, t));*/
while (i < j) {
/*dbprintf(("ly1: i=%ld(%ld) j=%ld(%ld) t=%ld\n", i, i+BASEYEAR,j,j+BASEYEAR, t));*/
t += DAYS_PER_YEAR;
if (LeapYear(i + BASEYEAR)) {
/*dbprintf(("leap year\n"));*/
t++;
}
i++;
}
/* t now is the number of days in whole years since ... */
/*dbprintf(("m0: i=%ld j=%ld t=%ld\n", i, j, t));*/
for (i = 0; i < month; i++) {
/*dbprintf(("m1: i=%ld j=%ld t=%ld\n", i, j, t));*/
t += daycount[i];
if (i == 1 && LeapYear(year)) {
t++;
}
}
/* t now is the number of days in whole months since ... */
t += day - 1;
/* t now is the number of days in whole days since ... */
datestamp->ds_Days = t;
}
}
void
ToMSDate(date, time, datestamp)
word *date;
word *time;
register struct DateStamp *datestamp;
{
{
word hours, minutes, seconds;
hours = datestamp->ds_Minute / MINUTES_PER_HOUR;
minutes = datestamp->ds_Minute % MINUTES_PER_HOUR;
seconds = datestamp->ds_Tick / TICKS_PER_SECOND;
*time = (hours << 11) | (minutes << 5) | (seconds / 2);
}
{
register long days, i, t;
int year, month, day;
days = datestamp->ds_Days;
year = BASEYEAR + (days/(4*DAYS_PER_YEAR+1)) * 4;
days %= 4 * DAYS_PER_YEAR + 1;
while (days) {
t = DAYS_PER_YEAR;
if (LeapYear(year))
t++;
if (days < t)
break;
days -= t;
year++;
}
days++;
for (i = 0; i < MONTHS_PER_YEAR; i++) {
t = daycount[i];
if (i == 1 && LeapYear(year))
t++;
if (days <= t)
break;
days -= t;
}
month = i + 1;
day = days;
*date = ((year - 1980) << 9) | (month << 5) | day;
}
}